import datetime
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from ..items.item4dushu import Item4Dushu

# 读书网案例
class ReadSpider(CrawlSpider):
    name = 'read'    # 爬虫名称（读书）
    allowed_domains = ['www.dushu.com']
    start_urls = ['https://www.dushu.com/book/1188.html']
    custom_settings = {
        'LOG_FILE': f"logs/{name}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.log",
        'ITEM_PIPELINES': { # 管道优先级（高于 settings.py 中的 ITEM_PIPELINES属性）
            'scrapy_demo_test.pipelines.dushu_pipelines.JsonSerializePipeline': 302,
            # 'scrapy_demo_test.pipelines.dushu_pipelines.JsonPipeline': 303, 
            # 'scrapy_demo_test.pipelines.dushu_pipelines.MysqlPipeline': 304, 
        }
    }

    rules = (
        Rule(LinkExtractor(allow=r'/book/1188_\d+\.html'), callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        # xpath
        # 通过XPath定位所有符合结构的<a>标签，层级路径为：ul → li → div[@class="book-info"] → div → a
        # 关键点：
        ## @class="book-info" 表示筛选具有该class属性的<div>元素
        ## 最终目标是获取包裹图片的<a>标签列表
        img_list = response.xpath('//ul/li/div[@class="book-info"]/div/a')  
        for i in img_list:
            src = i.xpath('./img/@data-original').extract_first() # 从当前节点(<a>)的子节点<img>中提取data-original属性值（通常用于懒加载图片的真实地址）
            name = i.xpath('./img/@alt').extract_first() # 从当前节点(<a>)的子节点<img>中提取alt属性值（通常用于图片的标题）
            # item
            books = Item4Dushu(src=src, bknm=name)
            # yield books 若注释掉，此时的books只是一个字典，则该程序经过了pipeline处理，就无法保存成数据文件。
            yield books